package eva.savant.business.ventas.service

import eva.savant.businessobject.vt.Pedido
import eva.savant.businessobject.vt.Precio
import eva.savant.core.service.TSEntity
import org.springframework.stereotype.Repository

@Repository(value = 'tsPedido')
public class TSPedidoImpl extends TSEntity implements TSPedido {

  public Pedido save(Pedido p) throws Exception {

    sociedadId= p.sociedadId

    if(p.lsPedidoDetalle?.isEmpty()) throw new Exception('El detalle del pedido esta vacio o es invalido')

    if(p.prevendedor?.id == null) throw new Exception('El prevendedor para el pedido es invalido')

    if(p.cliente == null) throw new Exception('El cliente para el pedido es invalido')

    if(p.cliente.canal == null) throw new Exception('La lista de precio del cliente es invalido')

    if(p.entrega == null) p.entrega= p.fecha


    p.importe   = 0

    p.impuesto  = 0

    p.descuento = 0

    p.total     = 0

    //p.fecha     = new Date()


    for(d in p.lsPedidoDetalle) {

    def pr= get(Precio.class,'canal.id=? and material.id=?',p.cliente.canal.id,d.material.id)

    if( pr?.precio==null) throw new Exception('Precio o producto invalido en el canal '+p.cliente.canal.id)

    if( d.cantidad < 0 ) throw new Exception('La cantidad del material '+ d.material.id + ' debe ser mayor a cero')


    d.pedido      = p

    d.solicitado  = d.solicitado != null? d.solicitado : d.cantidad

    d.devuelto    = d.devuelto   != null? d.devuelto : 0

    d.cantidad    = d.solicitado - d.devuelto

    d.precio      = pr.precio

    d.importe     = d.cantidad * d.precio

    d.impuesto    = pr?.impuesto  > 0? (d.cantidad * pr.impuesto) : 0

    d.descuento   = pr?.descuento > 0? (d.cantidad * pr.descuento) : 0

    d.total       = (d.importe - d.descuento) + d.impuesto

    d.operacionId = p.operacionId

    d.sociedadId  = p.sociedadId

    d.usuarioId   = p.usuarioId


    p.importe  = p.importe   + d.importe

    p.impuesto = p.impuesto  + d.impuesto

    p.descuento= p.descuento + d.descuento

    p.total    = p.total     + d.total   }

    return merge(p)
  }

}
